# 使用轻量级 Alpine 版本的 OpenJDK 17 官方镜像，适合部署 Spring Boot 应用
FROM openjdk:17-alpine

# 设置构建时变量，默认使用构建好的 jar 文件
ARG JAR_FILE=target/app.jar

# 设置运行时环境变量
ENV JAVA_OPTS="-Xms4096M -Xmx4096M -XX:MetaspaceSize=256M -XX:MaxMetaspaceSize=256M"
ENV TZ=Asia/Shanghai

# 镜像元信息
LABEL maintainer="yourname@example.com"
LABEL version="1.0.0"
LABEL description="用于部署 Spring Boot 应用的生产级镜像"

# 设置工作目录
WORKDIR /app

# 示例 RUN：安装 curl（用于容器健康检查或调试）
RUN apk add --no-cache curl

# 复制 Spring Boot 构建生成的 jar 包
COPY ${JAR_FILE} app.jar

# 解压静态资源到容器中（ADD 可以自动解压 tar.gz）
ADD static-assets.tar.gz /app/public/

# 声明暴露的应用端口（Spring Boot 默认是 8080）
EXPOSE 8080

# 容器健康检查：访问 actuator 健康端点
HEALTHCHECK --interval=30s --timeout=5s --retries=3 \
  CMD curl -f http://localhost:8080/app/actuator/health || exit 1

# 容器终止时优雅关闭（Java 推荐 SIGTERM）
STOPSIGNAL SIGTERM

# 设置容器启动时的主命令（ENTRYPOINT 不会被 docker run 参数覆盖）
ENTRYPOINT ["sh", "-c", "java $JAVA_OPTS -jar app.jar"]

# CMD 提供默认的运行参数，可以被 docker run 覆盖
# 这里通过 Spring Boot 参数设置启动环境和端口号
CMD ["--spring.profiles.active=app", "--server.port=8080"]
# 这里使用的是 ENTRYPOINT + CMD 的混合模式
# 完整命令： java $JAVA_OPTS -jar app.jar --spring.profiles.active=app --server.port=8080

# 声明一个卷挂载点，运行容器时可将该路径映射到宿主机，实现数据持久化
VOLUME ["/app/logs"]
